Amazon Bedrock の Converse API を使ってみる

Amazon Bedrock の Converse API を使ってみる

Clock Icon2024.07.05

こんにちは、森田です。

Amazon Bedrock には、Converse API と呼ばれる便利なモデル呼び出し方法があります。

https://aws.amazon.com/jp/about-aws/whats-new/2024/05/amazon-bedrock-new-converse-api/

本記事では、Converse API の良さとその使い方について紹介します。

InvokeModel APIについて

従来、基盤モデルを利用するためには、InvokeModel APIを使用していました。

InvokeModel APIでは、以下のように各モデルごとでプロンプトの渡し方やパラメータの指定、出力結果が異なっていました。

Amazon Titan Text(InvokeModel API)
import boto3
import json

prompt = "クラスメソッド株式会社について教えて"

body = json.dumps({
    "inputText": f"User: {prompt}\nBot:",
    "textGenerationConfig": {
        "temperature": 0.1,
        "topP": 0.9,
        "maxTokenCount": 500,
        "stopSequences": [],
    }
})

bedrock_runtime = boto3.client(
    service_name='bedrock-runtime', 
    region_name='us-east-1'
)
modelId = 'amazon.titan-text-premier-v1:0'

response = bedrock_runtime.invoke_model(
    body=body, 
    modelId=modelId, 
    accept='application/json', 
    contentType='application/json'
)

body = response.get('body').read().decode('utf-8')
response_body = json.loads(body)
print(response_body['results'][0]['outputText'])

https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-titan-text.html

Anthropic Claude(InvokeModel API)
import boto3
import json

prompt = "クラスメソッド株式会社について教えて"

bedrock_runtime = boto3.client(
    service_name='bedrock-runtime', 
    region_name='us-east-1'
)

body = json.dumps({
   "anthropic_version": "bedrock-2023-05-31",
   "max_tokens": 1000,
   "messages": [
       {
           "role": "user",
           "content": [{"type": "text", "text": prompt}]
       }
   ]
})

modelId = 'anthropic.claude-3-sonnet-20240229-v1:0'
response = bedrock_runtime.invoke_model(body=body, modelId=modelId)
response_body = json.loads(response.get('body').read())
print(response_body["content"][0]["text"])

https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html

InvokeModel APIを使っているアプリケーションでモデルの変更を行いたい場合は、各モデルごとのプロンプトやパラメータ、出力についての仕様を理解しながら、コードの変更を行う必要があります。

Converse API とは

Converse APIでは、Bedrockの基盤モデル対して共通したアクセスができるようになります。

InvokeModel APIのように、モデルごとの差異を意識することなく、モデルの切り替えが容易になります。

また、InvokeModel APIと同じようにStreamでの呼び出しも可能です。
このAPIを利用するためには、以下の権限が必要となります

  • bedrock:InvokeModel
  • bedrock:InvokeModelWithResponseStream。

ただし、現時点(2024/07/05)では、すべての基盤モデルで利用できるAPIではありませんので、ご注意ください。

Model Converse ConverseStream
AI21 Jamba-Instruct Yes No
AI21 Labs Jurassic-2 (Text) Limited. No chat support. No
Amazon Titan models Yes Yes
Anthropic Claude 2 and earlier Yes Yes
Anthropic Claude 3 Yes Yes
Anthropic Claude 3.5 Yes Yes
Cohere Command Limited. No chat support. Limited. No chat support.
Cohere Command Light Limited. No chat support. Limited. No chat support.
Cohere Command R and Command R+ Yes Yes
Meta Llama 2 and Llama 3 Yes Yes
Mistral AI Instruct Yes Yes
Mistral Large Yes Yes
Mistral Small Yes Yes

https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html#conversation-inference-supported-models-features

コード例

では、実際に、Amazon Titan Text を Converse API で呼び出してみます。

Amazon Titan Text(Converse API)
import boto3

client = boto3.client("bedrock-runtime", region_name="us-east-1")
modelId = 'amazon.titan-text-premier-v1:0'

prompt = "クラスメソッド株式会社について教えて"

messages = [
    {
        "role": "user",
        "content": [{"text": prompt}],
    }
]

inferenceConfig = {
    "temperature": 0.1,
    "topP": 0.9,
    "maxTokens": 500,
    "stopSequences":[]
}

response = client.converse(
    modelId=modelId ,
    messages=messages,
    inferenceConfig=inferenceConfig
)

print(response["output"]["message"]["content"][0]["text"])

入力パラメータ

modelId

modelIdには、Amazon Bedrock のモデルIDを指定します。

https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html

messages

messagesには、以下のような Message オブジェクトをリスト型で渡します。

Messageオブジェクト
{
    "role": "user | assistant",
    "content": [
        {
            "text": "string"
        }
    ]
}

inferenceConfig

以下4つの基本的な推論パラメータの指定を行います。

  • temperature
  • topP
  • maxTokens
  • stopSequences

また、上記以外の各モデルの固有のパラメータは、 additionalModelRequestFields として指定が可能です。

レスポンス

レスポンスについては以下のようなフォーマットとなります。

{
    "output": {
        "message": {
            "role": "assistant",
            "content": [
                {
                    "text": "---生成されたテキスト---"
                }
            ]
        }
    },
    "stopReason": "end_turn",
    "usage": {
        "inputTokens": 125,
        "outputTokens": 60,
        "totalTokens": 185
    },
    "metrics": {
        "latencyMs": 1175
    }
}

テキスト情報を取得したい場合は、以下のようなコードとなります。

テキスト情報の出力
print(response["output"]["message"]["content"][0]["text"])

まとめ

Converse APIは、基盤モデルへの共通アクセスを提供し、モデル切り替えを容易にする画期的な機能です。

従来の InvokeModel API と異なり、モデル間の差異を意識せず利用可能で、ストリーミングにも対応しています。
ただし、現時点では一部モデルのみ対応しているため、利用される際にはご注意ください。

この API の登場により、開発者は異なるモデル間でのコード変更を最小限に抑えられ、より柔軟なアプリケーション開発が可能になると期待できるので、ぜひチェックしてみてください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.